package com.cskaoyan.util.smsutil;

import com.cskaoyan.util.common.Constant;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.sms.v20210111.SmsClient;
import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse;
import com.tencentcloudapi.sms.v20210111.models.SendStatus;

/**
 * @auther zk
 * @date 2022/7/19 19:24
 */
public class SmsUtils {

    public static String sendSms(String verificationCode, String phone) {

        String sendStatus = "";

        try {
            Credential cred = new Credential(Constant.ZK_COS_SECRET_ID, Constant.ZK_COS_SECRET_KEY);

            // 实例化一个http选项，可选，没有特殊需求可以跳过
            HttpProfile httpProfile = new HttpProfile();

            // SDK默认使用POST方法，GET方法无法处理一些较大的请求
            httpProfile.setReqMethod("POST");

            // SDK有默认的超时时间，非必要请不要进行调整
            httpProfile.setConnTimeout(60);

            // 指定接入地域域名，默认就近地域接入域名为 sms.tencentcloudapi.com
            httpProfile.setEndpoint("sms.tencentcloudapi.com");

            // 非必要步骤:实例化一个客户端配置对象，可以指定超时时间等配置
            ClientProfile clientProfile = new ClientProfile();

            // SDK默认用TC3-HMAC-SHA256进行签名
            clientProfile.setSignMethod("HmacSHA256");
            clientProfile.setHttpProfile(httpProfile);

            // 实例化要请求产品
            SmsClient client = new SmsClient(cred, "ap-guangzhou", clientProfile);

            // 实例化一个请求对象，可以进一步设置请求参数
            SendSmsRequest req = new SendSmsRequest();

            // 短信应用ID
            req.setSmsSdkAppId(Constant.ZK_COS_SMS_SDK_APPID);

            // 短信签名内容
            req.setSignName(Constant.ZK_COS_SMS_SIGN_NAME);

            // 模板 ID
            req.setTemplateId(Constant.ZK_COS_SMS_TEMPLATE_ID);

            // 模板参数: 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致，若无模板参数，则设置为空
            req.setTemplateParamSet(new String[]{verificationCode, "5"});

            // 下发手机号码，采用 E.164 标准，+[国家或地区码][手机号] ，最多不要超过200个手机号
            req.setPhoneNumberSet(new String[]{"+86" + phone});

            // 通过 client 对象调用 SendSms 方法发起请求
            SendSmsResponse res = client.SendSms(req);

            SendStatus[] sendStatusSet = res.getSendStatusSet();

            String code = sendStatusSet[0].getCode();

            switch (code) {
                case "Ok": {
                    sendStatus = "发送成功";
                    break;
                }
                case "InvalidParameterValue.IncorrectPhoneNumber": {
                    sendStatus = "电话号码错误";
                    break;
                }
                case "LimitExceeded.PhoneNumberThirtySecondLimit": {
                    sendStatus = "您操作过于频繁，请30秒后再试";
                    break;
                }
                case "LimitExceeded.PhoneNumberOneHourLimit": {
                    sendStatus = "您操作过于频繁，请1小时后再试";
                    break;
                }
                case "LimitExceeded.PhoneNumberDailyLimit": {
                    sendStatus = "您操作过于频繁，请1天后再试";
                    break;
                }
                default: {
                    sendStatus = "未知错误";
                }
            }
        } catch (TencentCloudSDKException e) {
            e.printStackTrace();
        }

        return sendStatus;
    }

}
